/*
 * Пакет "Экосистема"
 * реализует модель экологической системы
 */
package vitarium.ecosystem;

import java.util.ArrayList;
import java.util.LinkedList;
import vitarium.ecosystem.events.*;

/**  Элемент Биоценоза - Живой организм */
public class BiocoenosisElement extends EcoSystemElement {

    /** Список классов объектов,
     * которыми питается объект данного класса
     * Рацион питания
     */
    protected LinkedList<Class> diet;
    /** Коллекция, которой принадлежит объект */
    protected LinkedList currentList;

    public BiocoenosisElement(EcoSystem world, int longitude, int latitude, int detritus, int organics, int humus, String imagePath) {
        super(world, longitude, latitude, 0, 0, detritus, organics, humus, imagePath);

        this.addElementEatenListener(new ElementEatenListener() {

            public void elementEaten(ElementEatenEvent event) {
                event.deleteEatenElement();
            }
        });
    }

    /** Убивает текущий объект
     */
    public void delete() {
        currentList.remove(this);

    }

    /** Проверка объекта данного класса на съедобность для subject */
    public boolean isEdible(BiocoenosisElement subject) {
        /* Если у объекта есть определенный рацион сверяем объект с ним*/
        if (subject.diet != null) {

            java.util.Iterator it = subject.diet.iterator();

            /* Пробегаем по диете объекта subject */
            while (it.hasNext()) {

                /* Класс элемента рациона объекта subject*/
                Class foodClass = (Class) it.next();
                /** Если класс элемента рациона совпадает с
                 * классом текущего элемента возвращает true
                 */
                if (foodClass.equals(this.getClass())) {
                    return true;
                } else {
                    return false;
                }
            }
        }
        return false;
    }

    /** Проверка объекта данного класса на опасность для subject */
    public boolean isDangerous(Consumens subject) {

        if (subject.isEdible(this)) {
            return true;
        } else {
            return false;
        }
    }
    /** Список слушателей события съедения объекта */
    private ArrayList<ElementEatenListener> elementEatenListeners = new ArrayList<ElementEatenListener>();

    /** Добавление слушателя событию съедения объекта */
    public void addElementEatenListener(ElementEatenListener listener) {
        elementEatenListeners.add(listener);
    }

    /** Возвращает массив слушателей события съедения объекта  */
    public ElementEatenListener[] getElementEatenListeners() {
        return elementEatenListeners.toArray(new ElementEatenListener[elementEatenListeners.size()]);
    }

    /** Удаляет слушателя события съедения объекта */
    public void removeElementEatenListener(ElementEatenListener listener) {
        elementEatenListeners.remove(listener);
    }

    /** Инициирует событие и оповещает слушателей при съедении объекта  */
    public void fireElementEaten(BiocoenosisElement eatenElement) {
        ElementEatenEvent ev = new ElementEatenEvent(this, eatenElement);
        for (ElementEatenListener listener : elementEatenListeners) {
            listener.elementEaten(ev);
        }

    }
}

